This short tutorial shows how to compile the Dhrystone benchmark and execute it on an CY7C68013A EZ-USB FX2LP USB2.0 Development Board with an extra RS232 board for serial communication. The author used a Debian GNU/Linux system, but the tutorial should work for other Linux distributions, *BSD or other Unices.
The tools we use are
The CY7C68013A EZ-USB FX2LP USB2.0 Development Board is connected to the host computer via a USB cable for power and to write the demo onto the board. We connect the RS232 board to the PA0 header for data and to the power header for power (VCC to +5V, GND to GND); the serial cable is then attached to the RS232 board. On the other end the serial cable is attached to an RS232 port on a computer running a terminal program configured for 1200 baud, no parity, 8 bits, 1 stop bit and no flow control. We used a USB-to-serial converter and gtkterm.
Depending on your operating system there might be an easy way to install SDCC 3.5.0 or newer using a package system or similar (e.g. apt-get install sdcc on Debian). While SDCC 3.4.0 should be sufficient for this tutorial, you might want to try a newer version in case you encounter any bugs.
SDCC binaries or a source tarball can be downloaded from its website.
Depending on your operating system there might be an easy way to install cycfx2prog using a package system or similar (e.g. apt-get install sdcc on Debian).
A source tarball can be downloaded from its website.
Download a version of Dhrystone adapted for use with SDCC and the EZ-USB FX2LP board.
Download, and unpack it using tar -xzf dhrystone-cy7c68013a-softuartpa0-sdcc-3.6.0.tar.gz
, change into the directory dhrystone-cy7c68013a-softuartpa0-sdcc-3.6.0.
You can then compile dhrystone by typing make
. In the end there should be a file dhrystone.ihx.
A bit of custom code was necessary to make Dhrystone run using SDCC on the board. See the file dhry.h
and portme.c
for details. The file portme.c
basically combines clock()
from the timer demo and putchar()
from the serial demo. Since we are running a benchmark, and want good results, we also run the CPU at the full 48 Mhz (instead of the default 12 Mhz the other tutorials use).
Assuming the board is attached via USB, cycfx2prog prg:dhrystone.ihx run
will write Dhrystone onto the board. Dhrystone will run and report its results. You can see them by attaching a serial cable to the DB9 connector on the RS232 board, and using a terminal program configured for 1200 baud, no parity, 8 bits, 1 stop bit and no flow control. They should look like this (the benchmark numbers may vary depending on the SDCC version used to compile Dhrystone):
Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled with 'register' attribute Please give the number of runs through the benchmark: Execution starts, 20000 runs through Dhrystone Execution ends Final values of the variables used in the benchmark: Int_Glob: 5 should be: 5 Bool_Glob: 1 should be: 1 Ch_1_Glob: A should be: A Ch_2_Glob: B should be: B Arr_1_Glob[8]: 7 should be: 7 Arr_2_Glob[8][7]: 20010 should be: Number_Of_Runs + 10 Ptr_Glob-> Ptr_Comp: 15884 should be: (implementation-dependent) Discr: 0 should be: 0 Enum_Comp: 2 should be: 2 Int_Comp: 17 should be: 17 Str_Comp: DHRYSTONE PROGRAM, SOME STRING should be: DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob- Ptr_Comp: 15884 should be: (implementation-dependent), same as above Discr: 0 should be: 0 Enum_Comp: 1 should be: 1 Int_Comp: 18 should be: 18 Str_Comp: DHRYSTONE PROGRAM, SOME STRING should be: DHRYSTONE PROGRAM, SOME STRING Int_1_Loc: 5 should be: 5 Int_2_Loc: 13 should be: 13 Int_3_Loc: 7 should be: 7 Enum_Loc: 1 should be: 1 St_1_Loc: DHRYSTONE PROGRAM, 1'ST STRING should be: DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc: DHRYSTONE PROGRAM, 2'ND STRING should be: DHRYSTONE PROGRAM, 2'ND STRING Microseconds for one run through Dhrystone: 1252 Dhrystones per Second: 798
cycfx2prog was written by Wolfgang Wieser. It is a tool to program the FX2 (i.e. to download '8051 firmware into the RAM) and do basic endpoint communication for testing purposes. cycfx2prog requires the input file to be an .ihx Intel hex file.
SDCC was initially written by Sandeep Dutta for the MCS-51, and has a relatively conservative architecture (see Sandeep Dutta, "Anatomy of a Compiler", 2000). It has been extended by various contributors and more recently, incorporated some cutting-edge technologies, in particular in register allocation (see Philipp Klaus Krause, "Optimal Register Allocation in Polynomial Time", 2013 and "Bytewise Register Allocation", 2015). However the mcs51 backend does not have all the fancy features and optimizations that some newer backends have.
SDCC is a C compiler that aims to be compliant with the C standards.
Important compiler options for MCS-51 developers include:
-c
to compile into object files to be linked later--std-c99
for compilation in C99 mode (some C99 features, e.g. variable-length arrays are not yet supported in sdcc though)--model-large
to use the xram for variables by default